package com.ecommerce.health;

import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.ExitCodeGenerator;
import org.springframework.stereotype.Component;

import java.util.LinkedHashMap;
import java.util.Map;

/**
 * 应用启动失败处理器组件
 * 当应用因关键服务(如Elasticsearch)连接失败而无法启动时，
 * 提供友好的错误信息并返回非零退出码
 */
// StartupFailureHandler.java
@Component
@Slf4j
public class StartupFailureHandler implements ExitCodeGenerator {

    /**
     * 静态错误消息映射表
     * Key: 服务名称
     * Value: 格式化后的错误提示信息
     * 使用LinkedHashMap保持插入顺序
     */
    private static final Map<String, String> FAILURE_MESSAGES = new LinkedHashMap<>();

    // 静态初始化块，预置各类服务的错误提示信息
    static {
        /**
         * Elasticsearch连接失败的详细错误提示
         * 包含可能原因和检查建议
         */
        FAILURE_MESSAGES.put("Elasticsearch",
                "========================================================\n" +
                        "Application failed to start due to Elasticsearch connection issues!\n" +
                        "Possible reasons:\n" +
                        "1. Elasticsearch server is not running\n" +
                        "2. Network connectivity problems\n" +
                        "3. Incorrect configuration in application.yml\n" +
                        "4. Authentication failure\n" +
                        "\n" +
                        "Please check:\n" +
                        "- Elasticsearch server status\n" +
                        "- Configuration: spring.elasticsearch.uris\n" +
                        "- Network connection between application and ES\n" +
                        "========================================================");
    }

    /**
     * 实现ExitCodeGenerator接口的方法
     * @return 非零退出码(1表示异常退出)
     */
    @Override
    public int getExitCode() {
        // 遍历所有预置的错误消息
        FAILURE_MESSAGES.forEach((service, message) -> {
            // 记录错误日志
            log.error(message);
            // 同时在控制台输出错误信息
            System.err.println(message); // 确保在控制台也显示
        });

        // 返回非零退出码表示异常退出
        return 1; // 非0退出码表示异常退出
    }
}